package com.own.demo.lwf.encryption.digitalSignature;

import java.security.*;

/**
 * @version v1.0
 * @Description:
 * 数字签名是一种用于验证消息完整性和认证消息来源的机制。
 * 它使用私钥对消息的摘要值进行加密，并将加密后的值和原始消息一起传递给接收方。
 * 接收方使用公钥对加密值进行解密，并验证摘要值是否与原始消息的摘要值相同。
 * @Author 李文峰
 * @Date 2023/7/22 0022 7:56
 */
        // - 使用 "SHA256withRSA" 算法创建一个 Signature 对象。
        // - 使用提供的私钥初始化 Signature 对象。
        // - 使用提供的数据更新 Signature 对象。
        // - 将签名后的数据作为字节数组返回。
public class DigitalSignatureExample {
    public static byte[] sign(PrivateKey privateKey, byte[] data) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data);
        return signature.sign();
    }

       // - 使用 "SHA256withRSA" 算法创建一个 Signature 对象。
       // - 使用提供的公钥初始化 Signature 对象。
       // - 使用提供的数据更新 Signature 对象。
       // - 使用提供的签名字节数组验证签名。
       // - 返回一个布尔值，指示签名的有效性
    public static boolean verify(PublicKey publicKey, byte[] data, byte[] signature) throws Exception {
        Signature verify = Signature.getInstance("SHA256withRSA");
        verify.initVerify(publicKey);
        verify.update(data);
        return verify.verify(signature);
    }

         // - 使用 "RSA" 算法创建一个 KeyPairGenerator 对象。
         // - 使用给定的密钥大小进行初始化。
         // - 生成一个包含公钥和私钥的 KeyPair。
         // - 返回生成的 KeyPair
    public static KeyPair generateKeyPair(int keySize) throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }
}
